#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int g1;        // 静态存储期
static int g2; // 静态存储期，static不影响全局变量的生命周期，只影响作用域

void f(void);

int main(int argc, char const *argv[])
{
    f();
    f();
    f();
    f();
    printf("g1: %d\n", g1);
    printf("g2: %d\n", g2);

    char *p = malloc(100); // 内存泄漏，即有内存没有归还给系统
    bzero(p, 100);
    free(p);

    p = calloc(5, 20); // 效果跟malloc(100)一样，多了自动清零
    strcpy(p, "hello world");
    p = realloc(p, 200); // 重新分配大小
    printf("%s\n", p);
    free(p);


    char a[100];
    char *p = a;
    free(p); // 错误的！free只能释放堆内存


    char names[100][20]; // 100个char [20]
    strcpy(names[0], "zhangsan");
    strcpy(names[1], "lisi");
    static char names[100][20]; // 100个char [20]


    char (*names)[20] = calloc(100, 20); // 让names指向100个连续内存单元，每个单元20个字节
    strcpy(names[0], "zhangsan");
    strcpy(names[1], "lisi");
    free(names);

    return 0;
}

char names[100][20]; // 100个char [20]

void f(void)
{
    g1++;
    g2++;
}
